// 函数指针详解
// 什么是函数指针？
// 函数指针，顾名思义，是指向函数的指针。
// 就像普通指针指向数据一样，函数指针指向代码。它允许我们：
// 1.存储函数的地址
// 2.通过指针调用函数
// 3.将函数作为参数传递给其他函数
// 4.从函数返回函数`

// 基本语法
// 函数指针的声明语法如下：
// 返回类型 (*指针名称)(参数类型列表);

// 例如，一个指向接受两个int参数并返回int的函数的指针：
int (*pFunc)(int, int);

// 简单示例
// 让我们看一个完整的例子：
// 定义两个函数
int add(int a, int b)
{
    return a + b;
}

int subtract(int a, int b)
{
    return a - b;
}

int main()
{
    // 声明一个函数指针
    int (*operation)(int, int);

    // 将函数地址赋给指针
    operation = add;

    // 通过指针调用函数
    int result = operation(5, 3); // 结果为8

    // 改变指针指向的函数
    operation = subtract;

    // 再次通过指针调用函数
    result = operation(5, 3); // 结果为2

    return 0;
}

// 函数指针作为参数
// 函数指针最常用的场景之一是作为参数传递给其他函数，这使得函数可以接受不同的行为：
// 一个使用函数指针的函数
void processArray(int arr[], int size, int (*processor)(int))
{
    for (int i = 0; i < size; i++)
    {
        arr[i] = processor(arr[i]);
    }
}

// 可能的处理函数
int double_value(int x)
{
    return x * 2;
}

int square(int x)
{
    return x * x;
}

// 使用
int main()
{
    int numbers[] = {1, 2, 3, 4, 5};

    // 将每个元素翻倍
    processArray(numbers, 5, double_value);

    // 或者计算每个元素的平方
    processArray(numbers, 5, square);

    return 0;
}

// 函数指针类型定义
// 为了简化函数指针的使用，我们可以使用typedef或using创建类型别名：
// 使用typedef
typedef int (*BinaryOperation)(int, int);

// 或者使用C++11的using (推荐)
using BinaryOperation = int (*)(int, int);

// 现在可以这样使用
BinaryOperation op = add;
int result = op(5, 3);